package com.ww.util.guava;

import com.google.common.collect.*;

import java.util.*;

public class CollectionDemo01 {

    @SuppressWarnings("unused")
	public static void main(String[] args) {
        /**
         * 普通Collection
         */
        List<String> list = Lists.newArrayList();
        Set<String> set = Sets.newHashSet();
        Map<String, String> map = Maps.newHashMap();

        /**
         * 不变Collection的创建
         * 创建不可变集合，先理解什么是immutable（不可变）对象
         * 1、在多线程操作下，是线程安全的；
         * 2、所有不可变集合会比可变机会有更有效的利用资源；
         * 3、中途不可改变
         */

        /**
         * 声明了一个不可变的List集合，类中的操作集合方法（譬如add，set，sort，replace等）都被声明为过期，并且抛出异常。
         */
        ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
        ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");
        ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");

        /**
         * 当我们需要一个map中包含key为String类型，value为List类型的时候，以前我们这样写
         */
        Map<String, List<Integer>> map2 = new HashMap<>();
        List<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        map2.put("aa", list2);
        System.out.println(map2.get("aa"));

        /**
         * 现在可以这么写，简单多了
         */
        Multimap<String, Integer> map3 = ArrayListMultimap.create();
        map3.put("aa", 1);
        map3.put("aa", 2);
        System.out.println(map3.get("aa"));

        System.out.println("**************************************");

        /**
         * MultiSet：无序 + 可重复
         * count()方法获取单词的次数，增强了可读性+操作简单
         */
        Multiset<String> set2 = HashMultiset.create();

        /**
         * Multimap：key-value key可以重复
         */
        Multimap<String, String> teachers = ArrayListMultimap.create();

        /**
         * BiMap：双向Map（Bidirectional Map）键与值都不重复
         */
        BiMap<String, String> biMap = HashBiMap.create();

        /**
         * Table：双键的Map，有点像联合主键
         */
        Table<String, String, Integer> tables = HashBasedTable.create();

        System.out.println("**************************************");
    }
}
